<?php
/**
 * Application level Controller
 *
 * This file is application-wide controller file. You can put all
 * application-wide controller-related methods here.
 *
 * PHP versions 4 and 5
 *
 * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
 * Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org)
 *
 * Licensed under The MIT License
 * Redistributions of files must retain the above copyright notice.
 *
 * @copyright     Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org)
 * @link          http://cakephp.org CakePHP(tm) Project
 * @package       cake
 * @subpackage    cake.app
 * @since         CakePHP(tm) v 0.2.9
 * @license       MIT License (http://www.opensource.org/licenses/mit-license.php)
 */

/**
 * Application Controller
 *
 * Add your application-wide methods in the class below, your controllers
 * will inherit them.
 *
 * @package       cake
 * @subpackage    cake.app
 */
class AppController extends Controller {
	
	var $helpers = array('Html', 'Javascript', 'Session', 'Ajax');
        
        var $components = array('Acl', 'Auth','Session');
 
	/**
 * Reconstruye el Acl basado en los controladores actuales de la aplicación.
 *
 * @return void
 */
    function buildAcl() {
        //Esta funcion solo es para inicializar los ACOs despues no se la utiliza mas
        $log = array();
 
        $aco =& $this->Acl->Aco;
        $root = $aco->node('controllers');
        if (!$root) {
            $aco->create(array('parent_id' => null, 'model' => null, 'alias' => 'controllers'));
            $root = $aco->save();
            $root['Aco']['id'] = $aco->id; 
            $log[] = 'Creado el nodo Aco para los controladores';
        } else {
            $root = $root[0];
        }   
 
        App::import('Core', 'File');
        $Controllers = Configure::listObjects('controller');
        $appIndex = array_search('App', $Controllers);
        if ($appIndex !== false ) {
            unset($Controllers[$appIndex]);
        }
        $baseMethods = get_class_methods('Controller');
        $baseMethods[] = 'buildAcl';
 
        // miramos en cada controlador en app/controllers
        foreach ($Controllers as $ctrlName) {
            App::import('Controller', $ctrlName);
            $ctrlclass = $ctrlName . 'Controller';
            $methods = get_class_methods($ctrlclass);
 
            //buscar / crear nodo de controlador
            $controllerNode = $aco->node('controllers/'.$ctrlName);
            if (!$controllerNode) {
                $aco->create(array('parent_id' => $root['Aco']['id'], 'model' => null, 'alias' => $ctrlName));
                $controllerNode = $aco->save();
                $controllerNode['Aco']['id'] = $aco->id;
                $log[] = 'Creado el nodo Aco del controlador '.$ctrlName;
            } else {
                $controllerNode = $controllerNode[0];
            }
 
            //Limpieza de los metodos, para eliminar aquellos en el controlador 
            //y en las acciones privadas
            foreach ($methods as $k => $method) {
                if (strpos($method, '_', 0) === 0) {
                    unset($methods[$k]);
                    continue;
                }
                if (in_array($method, $baseMethods)) {
                    unset($methods[$k]);
                    continue;
                }
                $methodNode = $aco->node('controllers/'.$ctrlName.'/'.$method);
                if (!$methodNode) {
                    $aco->create(array('parent_id' => $controllerNode['Aco']['id'], 'model' => null, 'alias' => $method));
                    $methodNode = $aco->save();
                    $log[] = 'Creado el nodo Aco para '. $method;
                }
            }
        }
        debug($log);
    }
        
        function beforeFilter(){
		//Ruta inicial.
		$this->Auth->actionPath = 'controllers/';
		//Le decimos a Auth que utilice el modelo Usuario, en lugar de User(por defecto para CakePHP)
		$this->Auth->userModel = 'User';
		$this->Auth->authorize = 'actions';
                $this->Auth->fields = array('username' => 'username', 'password' => 'user_password');
		//Configuramos AuthComponent
		//La acción correspondiente al login.
		$this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
		//La acción a la que se redirigirá una vez hecho el logout.
		$this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'login');
		//La acción a la que se redirigirá una vez hecho el login.
		$this->Auth->loginRedirect = array('controller' => 'masters', 'action' => 'inicio');
                $this->Auth->loginError = 'El nombre de usuario y/o la contraseña no son correctos. Por favor, inténtalo otra vez';
                $this->Auth->authError = 'Para entrar en la zona privada tienes que autenticarte';
		/*La siguiente línea permite el acceso sin restricción a toda la aplicación; debería ser utilizado
		solamente para pruebas y/o procesos temporales relacionados a ellas.*/
//		$this->Auth->allowedActions = array('*');
 
		//Se definen las acciones a las que se permitirá el acceso irrestricto.
		//$this->Auth->allowedActions = array('controller' => 'users', 'action' => 'logout');
		//Otra forma de declarar las acciones permitidas (en este caso, login y logout):
		$this->Auth->allowedActions= array('login', 'logout');
 
		// Ahora, nos aseguramos de cerrar la sesión en caso que se deniegue el acceso vía Auth+Acl.
		if($this->action!= 'login' && $this->action!= 'logout'){       
//                        $this->log($this->Auth->user());
//                        $this->log($this->name);
//                        $this->log($this->action);
			$permisoActual= $this->Acl->check($this->Auth->user(), $this->name.'/'.$this->action);
                        //$this->log($permisoActual);
			if ($permisoActual!=true){
                                $this->Session->setFlash('Permisos restrigidos');
				$this->redirect($this->Auth->logout());
                                
                                }
		}
	}
	function beforeRender()
	{        
            if($this->Session->read('Auth.User')){ 
            $user = $this->Session->read('Auth.User');   
               if($user['profiles_id']== 0){
                     $this->Session->write('perfil','0');
                     //$this->redirect(array('controller'=>'users','action' => 'change'));
                }else{
                    $this->Session->write('perfil','2');
                }
            }
	}
	
	// custom functions helper
	
	function ap($array)
	{
		echo "<pre>";
		print_r($array);
		echo "</pre>";
		exit;
	}
	
	function convertDateToSql($date)
	{
		if($date == "")
		{
			return $date;
		}

		$date = explode("/", $date);
		return $date[2] . "-" . $date[1] . "-" . $date[0]; 
	}
	
	function convertDateFromSql($date)
	{
		if($date == "")
		{
			return $date;
		}

		$date = explode("-", $date);
		return $date[2] . "/" . $date[1] . "/" . $date[0]; 
	}
	
	function checkAccess()
	{
            $user = $this->Session->read('Auth.User');            
               if($user['profiles_id']=='0'){
                     return true;
                     //$this->redirect(array('controller'=>'users','action' => 'change'));
                }else{
                    return false;
                }
    }
	
	function getCurrentUserId()
	{    
		$user = $this->Session->read('User');
		
		if($user != null)
		{		
			return $user['id'];
		}
		else
		{
			return 0;
		}
    }
}
